//配置路由的地方

import Vue  from "vue";
import VueRouter from "vue-router";
import store from "@/store";
import {reqLogout} from "@/api"
//使用插件
Vue.use(VueRouter);

//引入路由组件
import Home from '@/pages/Home'
import Search from '@/pages/Search'
import Login from '@/pages/Login'
import Register from '@/pages/Register'
import Detail from '@/pages/Detail'
import AddCartSuccess from '@/pages/AddCartSuccess'
import ShopCart from '@/pages/ShopCart'
import Trade from '@/pages/Trade'

//先把VueRouter 圆形对象的push 先保存一份  将vuepush进行二次封装   重写push和replace的方法
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//重写push|replace
// VueRouter.prototype.push = function(location, resolve, reject) {
//     //第一个形参：路由跳转的配置对象（query|params）
//     //第二个参数：undefined|箭头函数（成功的回调）
//     //第三个参数:undefined|箭头函数（失败的回调）
//     if (resolve && reject) {
//       //push方法传递第二个参数|第三个参数（箭头函数）
//       //originPush：利用call修改上下文，变为(路由组件.$router)这个对象，第二参数：配置对象、第三、第四个参数：成功和失败回调函数
//       originPush.call(this, location, resolve, reject);
//     } else {
//       //push方法没有产地第二个参数|第三个参数
//       originPush.call(
//         this,
//         location,
//         () => {},
//         () => {}
//       );
//     }
//   };
//第一个参数:告诉原先的push方法,往哪里跳
VueRouter.prototype.push =function(location,resolve,reject){
   if(resolve && reject){
       /**
        * call|| apply 区别
        * 相同点,都可以调用函数一次,都可以篡改函数的上下文一次
        * 不同点:call与apply传递参数,call传递参数用逗号隔开
        */
       originPush.call(this,location,resolve,reject);
   }else{
       originPush.call(this,location,()=>{},()=>{});
   }
}


VueRouter.prototype.replace = function(location,resole,reject){
    if(resole && reject){
        originReplace.call(this,location,resole,reject);
    }else{
        originReplace.call(this,location,()=>{ },()=>{ });
    }
}




let router =  new VueRouter({
    //配置路由
    routes:[
        {
            path:'/home',
            component:Home,
            meta:{
                show :true
            }
        },
        {   
            name:'search',
            // path:'/search/:keyWord?',
            path:'/search/:keyword?',
            component:Search,
            props:($route)=>({
                keyword:$route.params.keyword,
                k:$route.query.k
            }),
            meta:{
                show :true
            }
        },
        {
            path:'/login',
            component:Login,
            meta:{
                show :false
            }
        },
        {
            path:'/register',
            component:Register,
            meta:{
                show:false
            }
        },
        //重定向项目
        {
           path:'*',
           redirect:'/home',
           meta:{
            show :true
        }

        },
        {
            name:'detail',   //是当天路由的标识名称
            path:'/detail/:skuId',
            component:Detail,
            meta:{
                show:false
            }
        },
        //AddCartSuccess
        {
            name:'addCartSuccess',   //是当天路由的标识名称
            path:'/addCartSuccess',
            component:AddCartSuccess,
            meta:{
                show:true
            }
        },
        {
            name:'ShopCart',   //是当天路由的标识名称
            path:'/shopcart',
            component:ShopCart,
            meta:{
                show:true
            }
        },
        {
            name:'Trade',   //是当天路由的标识名称
            path:'/trade',
            component:Trade,
            meta:{
                show:true
            }
        }

    ],
    //滚动行为
    scrollBehavior (to, from, savedPosition) {
        //返回和这个y=0,代表滚动条的最上方
        return {y:0};
    },
    
    
});
export default router;

router.beforeEach(async (to, from, next) => {
   let token  = store.state.user.token;
   let name = store.state.user.userInfo.name;
   //用户已经登录了
   if(token){
        if(to.path == '/login' || to.path == '/register'){
            //如果已经登录了还想去登录注册页面则跳转到home页面
            next('/')
        }else{
            if(name){  //如果有姓名证明有个人信息则该去哪去哪
                console.log('9999999999')
                next();
            }else{  //如果没有要先调用个人信息的接口获取个人信息
                try {
                    console.log('888888888')
                   await store.dispatch('getUserInfo');
                    next();
                } catch (error) {
                    //token失效   调用清除token的接口 跳转到登录页面
                    // await store.dispatch('userLogout');
                    await reqLogout();
                    localStorage.removeItem('TOKEN');
                     next('/login')
                }
            }
        }
   }else{  //用户没有登录
    next()

   }
})